今天先不写Promise的核心API 我们先来实现一个race all等API
什么是Promise.all ?
Promise.all方法,接收一个数组,数组中的元素必须是一个Promise,或者是普通值。 它的返回值是一个Promise,并且可以通过then来调用 如果全部成功,这个返回的新Promise就会变成resolve状态,但凡有一个失败,那么就会变成reject态,还是比较严格的~ 代码实现: 首先就先直接返回一个新的Promise
Promise..myAll = function(promises) {
return new Promise((resolve, reject)=>{
const isPromise = p => typeof p.then === 'function' // 判断一个数据是不是Promise
let arr = []
let index = 0
const processData = (key, data)=>{
arr[key] = data
if(++index === promises.length){
resolve(arr)
}
}
for(let i=0;i<promises.length;i++) {
let result = promises[i]
if(isPromise(result)) {
result.then(data=>{
processData(i,data)
},reject)
}else {
// 如果这个result不是promise那么直接返回它。
processData(i, result)
}
}
})
}
Promise.race
和all类似,接收一个数组,将其包装成一个数组 只要有一个成功,就会resolve
Promise.myRace = function(promises) {
return new jPromise((resolve,reject)=>{
const isPromise = p => typeof p.then === 'function'
for (let i=0;i<promises.length;i++) {
let result = promises[i];
if(isPromise(result)) {
result.then(resolve,reject)
}else {
resolve(result)
}
}
})
}